package com.skyd.core.common;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * 提供序列化功能
 * 
 * @author SkyD
 * 
 */
public final class Serialization {

	/**
	 * 序列化到二进制文件
	 * 
	 * @param obj
	 *            序列化对象
	 * @param path
	 *            文件路径
	 * @throws IOException 异常
	 */
	public static void toFile(Object obj, String path) throws IOException {
		FileOutputStream s = new FileOutputStream(path);
		toStream(obj, s);
		s.close();
	}

	/**
	 * 序列化到二进制输出流
	 * 
	 * @param obj
	 *            序列化对象
	 * @param stream
	 *            输出流
	 * @throws IOException 异常
	 */
	public static void toStream(Object obj, OutputStream stream) throws IOException {
		ObjectOutputStream oos = new ObjectOutputStream(stream);
		oos.writeObject(obj);
		oos.close();
	}

	/**
	 * 反序列化自二进制文件
	 * 
	 * @param path
	 *            文件路径
	 * @return 反序列化得到的对象
	 * @throws IOException 异常
	 * @throws ClassNotFoundException 异常 
	 */
	public static Object formFile(String path) throws IOException, ClassNotFoundException {
		FileInputStream s = new FileInputStream(path);
		Object o = formStream(s);
		s.close();
		return o;
	}

	/**
	 * 反序列化自二进制输入流
	 * 
	 * @param stream
	 *            输入流
	 * @return 反序列化得到的对象
	 * @throws IOException 异常
	 * @throws ClassNotFoundException 异常
	 */
	public static Object formStream(InputStream stream) throws IOException, ClassNotFoundException {
		ObjectInputStream ois = new ObjectInputStream(stream);
		Object obj = ois.readObject();
		ois.close();
		return obj;
	}

	/**
	 * 序列化为XML字符串
	 * 
	 * @param obj
	 *            序列化对象
	 * @return XML字符串
	 */
	public static String toXMLString(Object obj) {
		return new XStream().toXML(obj);
	}

	/**
	 * 序列化到XML文件
	 * 
	 * @param obj
	 *            序列化对象
	 * @param path
	 *            文件路径
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static void toXMLFile(Object obj, String path)
			throws FileNotFoundException {
		toXMLStream(obj, new FileOutputStream(path));
	}

	/**
	 * 序列化XML到输出流
	 * 
	 * @param obj
	 *            序列化对象
	 * @param stream
	 *            输出流
	 */
	public static void toXMLStream(Object obj, OutputStream stream) {
		new XStream().toXML(obj, stream);
	}
	
	/**
	 * 反序列化自XML文件
	 * 
	 * @param <T>
	 *            对象类型
	 * @param path
	 *            文件路径
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static <T> T formXMLFile(String path, T rootobj)
			throws FileNotFoundException {
		return formXMLStream(new FileInputStream(path), rootobj);
	}

	/**
	 * 反序列化自XML输入流
	 * 
	 * @param <T>
	 *            对象类型
	 * @param stream
	 *            输入流
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 */
	public static <T> T formXMLStream(InputStream stream, T rootobj) {
		new XStream(new DomDriver()).fromXML(stream, rootobj);
		return rootobj;
	}

	/**
	 * 反序列化自XML文件
	 * 
	 * @param path
	 *            文件路径
	 * @return 反序列化得到的对象
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static Object formXMLFile(String path) throws FileNotFoundException {
		return formXMLStream(new FileInputStream(path));
	}

	/**
	 * 反序列化自XML输入流
	 * 
	 * @param stream
	 *            输入流
	 * @return 反序列化得到的对象
	 */
	public static Object formXMLStream(InputStream stream) {
		return new XStream(new DomDriver()).fromXML(stream);
	}

	/**
	 * 反序列化自XML字符串
	 * 
	 * @param <T>
	 *            对象类型
	 * @param xmlstring
	 *            字符串
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 */
	public static <T> T formXMLString(String xmlstring, T rootobj) {
		new XStream(new DomDriver()).fromXML(xmlstring, rootobj);
		return rootobj;
	}

	/**
	 * 反序列化自XML字符串
	 * 
	 * @param xmlstring
	 *            字符串
	 * @return 反序列化得到的对象
	 */
	public static Object formXMLString(String xmlstring) {
		return new XStream(new DomDriver()).fromXML(xmlstring);
	}
}
